// 参考《龙芯架构介绍》蒋卫峰，李涛的实现
// TODO: 需要调试，这两个函数过编译了但根本没法用

.globl spin_lock
.globl spin_unlock
.align 4

spin_lock:
    // 将locked值加载到寄存器t0，假设参数寄存器a0中为传入的参数locked
1:  ll.d $t0, $a0, 0
    // 如果locked不为0则跳转
    bnez $t0, 1b

    // 将t0置1并写入locked表示上锁，t0保存sc执行结果
    li.d $t0, 1
    sc.d $t0, $a0, 0
    // 如果sc失败则跳转
    bnez $t0, 1b
    // 栅障指令确保操作同步
    dbar 0

spin_unlock:
    // 栅障指令确保操作同步
    dbar 0
    // 将参数locked写入0
    st.d $zero, $a0, 0